贪心算法——有1元,5元,10元,50元,100元,500元的硬币各C1,C5,C10,C50,C100,C500枚。现在要用这些硬币来支付A元,最少需要多少枚硬币?

有1元,5元,10元,50元,100元,500元的硬币各C1,C5,C10,C50,C100,C500枚。现在要用这些硬币来支付A元,最少需要多少枚硬币?

先从面值最大的硬币往小遍历,用大面值的硬币越多,总数就越少

贪心算法思路:

for (int i = b.length - 1; i >= 0; i–)

  1. 尽可能多地使用面值为500元的硬币
    1. 再尽可能多地使用面值为100元的硬币
      1. 再尽可能多地使用面值为50元的硬币
        1. 再尽可能多地使用面值为10元的硬币
          1. 再尽可能多地使用面值为5元的硬币
            1. 再尽可能多地使用面值为1元的硬币

}

public class Main {

	public static void main(String[] args) {
		int[] a = { 1, 5, 10, 50, 100, 500 };//面值
		int[] b = new int[6];//输入的个数
		int pay = 0; //客户支付金额
		int count = 0;
		Scanner scanner = new Scanner(System.in);
		for (int i = 0; i < b.length; i++) {
			b[i] = scanner.nextInt();
		}
		pay = scanner.nextInt();
		for (int i = b.length - 1; i >= 0; i--) {
			int n = Math.min(pay/ a[i], b[i]); //n = (当前硬币数  , 实际硬币数 ) 取最小值
			pay = pay - a[i] * n;	//当前剩余金额
			count += n;
		}
		if (pay == 0) {
			System.out.println(count);
		}else {
			System.out.println("凑不到");
		}

	}
}
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用贪心算法来解决这个问题。具体步骤如下: 1. 首先将100全部换成50,得到2张50。 2. 然后将剩下的金额50全部换成20,得到2张20和1张10。 3. 最后将剩下的金额10全部换成1,得到5张10。 因此,将100换成10、2050的最优方案是:2张50、2张20、5张10。 ### 回答2: 要将100换成10、2050,我们需要考虑以下几种情况: 情况一:全都换成10纸币 由于10纸币是最小面额,我们可以用10纸币来换100,换成的张数是100除以10,等于10张。 情况二:全都换成20纸币 由于20纸币是中等面额,我们可以用20纸币来换100,换成的张数是100除以20,等于5张。 情况三:全都换成50纸币 由于50纸币是最大面额,我们可以用50纸币来换100,换成的张数是100除以50,等于2张。 情况四:换成10和20纸币 这种情况可以采用贪心算法进行计算,先用尽可能多的50纸币,再用尽可能多的20纸币,最后用10纸币补足。 通过计算得知,用50纸币2张可以换成100,剩下0。 换成的50纸币张数:2 换成的20纸币张数:0(没有剩余可以换的面额) 换成的10纸币张数:0(没有剩余可以换的面额) 情况五:换成1050纸币 同样,这种情况也可以采用贪心算法进行计算。 通过计算得知,用50纸币2张可以换成100,剩下0。 换成的50纸币张数:2 换成的20纸币张数:0(没有剩余可以换的面额) 换成的10纸币张数:0(没有剩余可以换的面额) 综上所述,将100换成10、2050可以有以下几种情况: 1. 全都换成101010纸币 2. 全都换成20:5张20纸币 3. 全都换成50:2张50纸币 4. 换成10和20:0张50纸币,0张20纸币,1010纸币 5. 换成1050:2张50纸币,0张20纸币,0张10纸币。 ### 回答3: 要将100换成10、2050,我们可以按照以下方法进行: 首先,我们可以用10换取100。由于10可以等值于100/10=10个,我们将得到1010。 接下来,我们可以用20换取100。由于20可以等值于100/20=5个,我们将得到5个20。 最后,我们可以用50换取100。由于50可以等值于100/50=2个,我们将得到2个50。 综上所述,将100换成10、2050,我们将得到1010、5个20和2个50
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值